# -*- coding: utf-8 -*-
import re
from django import forms
from lr.face.forms import NameField
from lr.register.models import Profile, Invite


class CabinetPerson1(forms.Form):
    """ Фамилия, имя, отчество и псевдоним при редактировании перосоны """
    
    last_name = NameField(max_length=30, required=False, widget=forms.TextInput, label=u'Фамилия')
    first_name = NameField(max_length=30, required=False, widget=forms.TextInput, label=u'Имя')
    patronymic = NameField(max_length=30, required=False, widget=forms.TextInput, label=u'Отчество')
    nickname = NameField(max_length=30, required=False, widget=forms.TextInput, label=u'Псевдоним')
    
    
    def save(self, user, last_name, first_name, patronymic, nickname, profile=None, update_now=True):
        """ Актуализирует данные пользователя """
        if not profile or profile.is_empty():
            raise Exception("User's profile is missing or corrupted.")
        
        profile.last_name = last_name
        profile.first_name = first_name
        profile.patronymic = patronymic
        profile.nickname = nickname
        
        if update_now:
            profile.save()
        return profile



class CabinetPerson2(forms.Form):
    """ Представление и подпись персоны """
    
    presentation = forms.ChoiceField(choices=Profile.PRESENT_CHOICES, label=u'Представление', initial=u'login')
    sign = forms.ChoiceField(choices=Profile.SIGN_CHOICES, label=u'Подпись', initial=u'login')
    gender = forms.ChoiceField(choices=Profile.GENDER_CHOICES, label=u'Пол', initial=u'x')
    
    
    def save(self, user, presentation, sign, gender, profile=None, update_now=True):
        """ Актуализирует подпись и представление пользователя """
        if not profile or profile.is_empty():
            raise Exception("User's profile is missing or corrupted.")
        
        profile.presentation = presentation
        profile.sign = sign
        profile.gender = gender
        
        if update_now:
            profile.save()
        return profile



class InviteForm(forms.Form):
    """ Форма активации приглашения для читателя """
    invite = forms.CharField(max_length=19, required=False, widget=forms.TextInput, label=u'Код Приглашения')
    
    
    def clean_invite(self):
        """ Проверка на наличие приглашения в системе """
        invite = self.cleaned_data['invite']
        if invite:
            # Найти пригласившего
            keys = re.search(ur'^(?P<k0>[0-9\u0041-\u0046]{4})\-(?P<k1>[0-9\u0041-\u0046]{4})\-(?P<k2>[0-9\u0041-\u0046]{4})\-(?P<k3>[0-9\u0041-\u0046]{4})$',
                             invite)
            if keys:
                k0 = int('0x' + keys.group('k0'), 16)
                k1 = int('0x' + keys.group('k1'), 16)
                k2 = int('0x' + keys.group('k2'), 16)
                k3 = int('0x' + keys.group('k3'), 16)
            else:
                raise forms.ValidationError(u'Неверный формат кода.')
            
            invites = Invite.objects.filter(key0=k0, key1=k1, key2=k2, key3=k3).only('owner')
            if len(invites) == 0:
                raise forms.ValidationError(u'Код приглашения не найден.')
        